package dao;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * CGLibDynamicProxy：通过创建被代理类的子类来创建代理对象。
 * （1）导入cglib依赖
 * （2）创建一个类，实现MethodInterceptor接口，重写intercept方法；
 * （3）在类中定义一个Object类型的变量，并提供这个变量的有参构造器，用于将被代理对象传进来；
 * （4）定义一个getProxy方法创建并返回对象，代理对象通过被代理类的子类创建；
 * */
public class CGLibDynamicProxy implements MethodInterceptor {

    //被代理对象
    private Object object;
    public CGLibDynamicProxy(Object object) {
        this.object = object;
    }

    public Object getProxy(){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(object.getClass());
        enhancer.setCallback(this);
        Object proxy = enhancer.create();
        return proxy;
    }

    //Method为传入的方法名字，Object[]为传放入方法的参数；
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        begin();
        //通过反射调用被代理类的方法；
        Object returnValue = method.invoke(object,objects);
        commit();
        return returnValue;
    }

    public void begin(){
        System.out.println("开启事务");
    }

    public void commit(){
        System.out.println("提交事务");
    }
}
